home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / e / modulesmc.lha / ModulesMC1 / stringf20.e < prev    next >
Encoding:
Text File  |  1994-11-19  |  7.3 KB  |  331 lines

  1. OPT MODULE
  2. SET PAD,LEFT,FIELD
  3.  
  4. EXPORT PROC stringf(str:PTR TO CHAR, format:PTR TO CHAR,
  5.             dataptr=NIL:PTR TO LONG)
  6. DEF tempstr[80]:ARRAY, left, right,
  7.     ch:REG, flag:REG, i:REG, j:REG, templen:REG
  8.  
  9.   MOVEM.L A2/A4/A6,-(A7)
  10.   MOVEA.L str,A4
  11.   MOVEA.L format,A6
  12. j20:   /* REPEAT */
  13.   MOVE.B (A6),(A4)+ /*   str[]++ := format[] */
  14. nextformat:
  15.   MOVEQ #0,flag
  16.   MOVE.L flag,i
  17.   MOVE.L i,right
  18.   MOVE.L i,left
  19.   MOVE.B (A6),ch     /*   ch:=format[]   */
  20.   CMPI.B #"%",ch     /*  IF ch="%" */
  21.   BNE.S endloop
  22. nextch:
  23.     ADDQ.W #1,i
  24.     MOVEA.L A6,A0    /*     ch:=format[i]   */
  25.     ADDA.W i,A0
  26.     MOVE.B (A0),ch
  27.     /*    SELECT    ch  */
  28.     CMPI.B #"l",ch   /* CASE "l" */
  29.     BNE.S j30
  30.       BRA gotlong
  31.     j30: CMPI.B #"s",ch   /* CASE "s" */
  32.     BNE.S j31
  33.       BRA.S gotstring
  34.     j31: CMPI.B #"-",ch    /* CASE "-" */
  35.     BNE.S j32
  36.       ORI.B #LEFT,flag    /*  flag:=flag OR LEFT    */
  37.       BRA.S nextch
  38.     j32: CMPI.B #"0",ch    /* CASE "0" */
  39.     BNE.S j29
  40.       ORI.B #PAD,flag    /*   flag:=flag OR PAD    */
  41.       BRA.S nextch
  42.     j29:  /* DEFAULT */
  43.     CMPI.B #"0",ch   /*  IF (ch>"0") AND (ch<="9") */
  44.     BLE.S j21
  45.     CMPI.B #"9",ch
  46.     BGT.S j21
  47.       ORI.B #FIELD,flag    /*    flag:=flag OR FIELD;  */
  48.       BRA field
  49.     j21:   /*  ELSE  */
  50.       MOVE.B (A6)+,(A4)+     /*  str[]++ := format[]++;  */
  51.       BRA.S nextformat
  52.     /*    ENDIF  */
  53.   /* ENDSELECT */
  54. endloop:   /*  ENDIF */
  55.   ADDQ.W #1,A6    /*  format++  */
  56.   MOVE.B -1(A4),j     /*  UNTIL str[-1]=0  */
  57.   BNE.S j20
  58.   MOVE.L A4,D1
  59.   SUB.L str,D1
  60.   SUBQ.L #1,D1     /* string length  */
  61.   MOVEA.L str,A0
  62.   CMP.W -4(A0),D1
  63.   BHI.S toolong
  64.   MOVE.W D1,-2(A0)
  65. toolong:
  66.   MOVE.L A0,D0
  67.   MOVEM.L (A7)+,A2/A4/A6
  68.   BRA endstringf
  69.  
  70. gotstring:
  71.   ADDA.W i,A6     /*  format:=format+i  */
  72.   SUBQ.W #1,A4     /* str-- */
  73.   MOVEA.L dataptr,A0     /* streamstring:=dataptr[]++ */
  74.   MOVEA.L (A0),A3
  75.   ADDQ.L #4,dataptr
  76.   BTST #2,flag /* IF flag AND  FIELD */
  77.   BEQ.S j15
  78.     MOVEA.L tempstr,A2         /*  savetempstr:=tempstr  */
  79.     MOVEQ #0,templen
  80.     j17:   /* REPEAT */
  81.     MOVE.B (A3)+,(A2)+ /* savetempstr[]++ := streamstring[]++ */
  82.     ADDQ.L #1,templen  /* templen++  */
  83.     MOVEQ #0,j
  84.     MOVE.B -1(A3),j   /*  UNTIL streamstring[-1]=0  */
  85.     BNE.S j17     /*  UNTIL j=0 */
  86.     MOVEA.L tempstr,A2 /*  savetempstr:=tempstr  */
  87.     SUBQ.L #1,templen
  88.     CMP.L right,templen  /*   IF templen>right THEN templen:=right  */
  89.     BLE.S j18
  90.     MOVE.L right,templen
  91.     j18:  BSR dopad
  92.     BRA.S j16
  93.  
  94.   j15:    /*  ELSE  */
  95.     j19:    /* REPEAT */
  96.       MOVE.B (A3)+,(A4)+  /* str[]++ := streamstring[]++ */
  97.       MOVE.B -1(A3),j   /* UNTIL streamstring[-1]=0 */
  98.       BNE.S j19   /* UNTIL j=0    */
  99.       SUBQ.L #1,A4  /* str-- */
  100.   j16:          /* ENDIF */
  101.   BRA.S endloop
  102.  
  103. gotlong:
  104.   ADDA.L i,A6  /*  format:=format+i+1    */
  105.   ADDQ.L #1,A6
  106.   SUBQ.L #1,A4    /* str-- */
  107.   MOVE.B (A6),ch   /* ch:=format[] */
  108.   /* SELECT ch    */
  109.   CMPI.B #"d",ch   /*CASE "d" */
  110.   BNE.S j25
  111.   MOVEA.L dataptr,A0  /*   number:=dataptr[]++;  */
  112.   MOVE.L (A0),D0
  113.   ADDQ.L  #4,dataptr
  114.   BTST #2,flag     /*  IF flag AND FIELD */
  115.   BEQ.S j5
  116.     MOVEA.L tempstr,A2 /*  savetempstr:=tempstr  */
  117.     MOVE.L A2,A0
  118.     BSR decimal
  119.     MOVE.L A0,D0
  120.     SUB.L A2,D0
  121.     MOVE.L D0,templen
  122.     BSR dopad
  123.     BRA.S j6
  124.  
  125.     /*      ELSE     */
  126.     j5:   MOVEA.L A4,A0  /* MOVE.L str,A0 */
  127.     BSR decimal
  128.     MOVEA.L A0,A4  /* MOVE.L A0,str  */
  129.     j6:   /*     ENDIF    */
  130.     BRA  j23
  131.  
  132.     j25:  /* CASE "x" */
  133.     CMPI.B #"x",ch
  134.     BNE.S j26
  135.       MOVEA.L dataptr,A0  /*   number:=dataptr[]++;  */
  136.       MOVE.L (A0),D0
  137.       ADDQ.L  #4,dataptr
  138.       BTST #2,flag  /* IF flag AND FIELD */
  139.       BEQ.S j7
  140.     MOVEA.L tempstr,A2 /*  savetempstr:=tempstr  */
  141.     MOVEA.L A2,A0  /* MOVEA.L savetempstr,A0 */
  142.     BSR hex
  143.     MOVE.L D0,templen
  144.     BSR.S dopad
  145.     BRA.S j8
  146.  
  147.       j7:  /*  ELSE  */
  148.     MOVEA.L A4,A0  /* MOVEA.L str,A0 */
  149.     BSR hex
  150.     MOVEA.L A0,A4  /*  MOVE.L A0,str  */
  151.       j8:     /*  ENDIF */
  152.       BRA.S j23
  153.  
  154.     j26:  /* CASE "c" */
  155.     CMPI.B #"c",ch
  156.     BNE.S j27
  157.       MOVEA.L dataptr,A0 /* str[]++:=dataptr[]++ */
  158.       ADDQ.L #4,dataptr
  159.       MOVE.B 3(A0),(A4)+    /* low byte of data  */
  160.       BRA.S j23
  161.  
  162.     j27:  /* CASE "b"; */
  163.     CMPI.B #"b",ch
  164.     BNE.S j24  /* default */
  165.       MOVEA.L dataptr,A0  /*   number:=dataptr[]++;  */
  166.       ADDQ.L  #4,dataptr
  167.       MOVE.L (A0),D0   /* sets flags for beq.s binzero  below */
  168.       MOVEA.L tempstr,A2
  169.       MOVEA.L A2,A0   /* MOVEA.L savetempstr,A0 */
  170.       BEQ.S binzero
  171.       MOVEQ #31,D1
  172.       next0:
  173.     BTST  D1,D0
  174.     DBNE D1,next0
  175.       nextbit:
  176.     BTST D1,D0
  177.     BEQ.S bit0
  178.     MOVE.B #"1",(A0)+
  179.     BRA.S bit1
  180.       bit0:
  181.     MOVE.B #"0",(A0)+
  182.       bit1:
  183.     DBRA D1,nextbit
  184.     BRA.S endbin
  185.       binzero:
  186.     MOVE.B #"0",(A0)+
  187.       endbin:
  188.     SUBA.L A2,A0  /* SUBA.L savetempstr,A0    */
  189.     MOVE.L A0,templen
  190.     BSR.S dopad
  191.     BRA.S j23
  192.  
  193.     j24: /* DEFAULT  */
  194.     /* str[]++ := "%"; str[]++ :="l"; str[]++ := ch  */
  195.     MOVE.W #"%l",(A4)+
  196.     MOVE.B ch,(A4)+
  197.   j23: /*ENDSELECT */
  198.   BRA endloop
  199.  
  200. dopad:
  201.   CMP.L left,templen          /*  IF templen>=left   */
  202.   BLT.S j13
  203.     MOVE.L templen,i
  204.     SUBQ.L #1,i
  205.     d1: MOVE.B (A2)+,(A4)+   /*  str[]++ := savetempstr[]++ */
  206.     DBRA i,d1
  207.     BRA.S j14
  208.  
  209.   j13:          /* ELSE */
  210.   BTST #0,flag /* j:=IF flag AND PAD THEN "0" ELSE " "   j is pad char  */
  211.   BEQ.S j9
  212.     MOVEQ #"0",j
  213.     BRA.S j10
  214.     j9: MOVEQ #" ",j
  215.     j10:
  216.     BTST #1,flag    /*     IF flag AND LEFT  */
  217.     BEQ.S j11
  218.       MOVE.L templen,i
  219.       SUBQ.L #1,i
  220.       d2: MOVE.B (A2)+,(A4)+   /*  str[]++ := savetempstr[]++ */
  221.       DBRA i,d2
  222.       MOVE.L left,i
  223.       SUB.L templen,i
  224.       SUBQ.L #1,i
  225.       d3:  MOVE.B j,(A4)+  /*  str[]++:=padch */
  226.     DBRA i,d3
  227.       BRA.S j12
  228.  
  229.     j11:     /* ELSE  */
  230.       MOVE.L left,i
  231.       SUB.L templen,i
  232.       SUBQ.L #1,i
  233.       d4:  MOVE.B j,(A4)+  /*  str[]++:=padch */
  234.     DBRA i,d4
  235.       MOVE.L templen,i
  236.       SUBQ.L #1,i
  237.       d5: MOVE.B (A2)+,(A4)+   /*  str[]++ := savetempstr[]++ */
  238.     DBRA i,d5
  239.     j12:      /* ENDIF */
  240.   j14:       /* ENDIF */
  241.   RTS
  242.  
  243. field:
  244.   ANDI.B #$F,ch     /*    left:=ch-"0" */
  245.   MOVE.L ch,j
  246.   j1: MOVEA.L A6,A3
  247.     ADDA.L i,A3
  248.     CMPI.B #".",1(A3)
  249.     BEQ.S j2
  250.     MOVE.B 1(A3),ch
  251.     ANDI.B #$F,ch
  252.     ADDQ.L #1,i
  253.     MULU #10,j      /*   left:=10*left+ch-"0"  */
  254.     ADD.L ch,j
  255.     BRA.S j1
  256.  
  257.   j2: MOVE.L j,left
  258.     ADDQ.L #2,i
  259.     MOVEA.L A6,A3
  260.     ADDA.L i,A3
  261.     MOVE.B (A3),ch
  262.     ANDI.B #$F,ch    /*   right:=ch-"0"    */
  263.     MOVE.B ch,j
  264.  
  265.   j3: MOVEA.L A6,A3
  266.     ADDA.L i,A3
  267.     CMPI.B #"0",1(A3)
  268.     BLT.S j4
  269.     CMPI.B #"9",1(A3)
  270.     BGT.S j4
  271.       ADDQ.W #1,A6
  272.       MOVEA.L A6,A3
  273.       ADDA.L i,A3
  274.       MOVE.B (A3),ch    /*   right:=10*right+ch-"0"  */
  275.       ANDI.B #$F,ch
  276.       MULU #10,j
  277.       ADD.L ch,j
  278.       BRA.S j3
  279.  
  280.   j4: MOVE.L j,right
  281.     BRA nextch
  282.  
  283. decimal:
  284.   SUBA.W  #14,A7
  285.   MOVEA.L A7,A3
  286.   MOVE.L D0,D2
  287.   BGE.S repeat
  288.     NEG.L D0
  289.   repeat:
  290.     MOVEQ  #0,D1
  291.     LONG $4C7C0401,$A    /* DIVU.L #10,D1:D0    68020 instruction  */
  292.     ADDI.B #"0",D1
  293.     MOVE.B D1,(A3)+
  294.     TST.L D0
  295.     BGT.S repeat
  296.   TST.L D2
  297.   BGE.S notneg
  298.     MOVE.B #"-",(A3)+
  299.     notneg:
  300.       MOVE.B  -(A3),(A0)+
  301.       CMPA.L  A3,A7
  302.       BLT.S notneg
  303.     ADDA.W #14,A7
  304.     RTS
  305. hex:
  306.   MOVEA.L A7,A3
  307.   SUBA.W  #14,A3
  308.   MOVEQ #-1,D2
  309.   nextltr:
  310.     MOVE.B D0,D1
  311.     ANDI.B #$0F,D1
  312.     ADDI.B #48,D1
  313.     CMPI.B #57,D1
  314.     BLE.S around
  315.       ADDQ.B #7,D1
  316.     around:
  317.     MOVE.B D1,(A3)+
  318.     LSR.L #4,D0
  319.     DBEQ D2,nextltr
  320.     NOT.L D2
  321.     MOVE.L D2,D0
  322.     ADDQ.L #1,D0
  323.     loadstr:
  324.       MOVE.B -(A3),(A0)+    /* reverse buffer  */
  325.       DBF D2,loadstr
  326.     RTS
  327.  
  328. endstringf:
  329. ENDPROC D0
  330.  
  331.